package cn.com.anypay.manager.payment.core;

import cn.com.anypay.manager.payment.dto.*;

/**
 * 支付产品接口
 *
 * 定义支付产品的标准接口，所有具体的支付产品都需要实现此接口
 * 使用策略模式，每个产品类型作为一个具体的策略实现
 *
 * @author AnyPay Team
 * @version 1.0
 * @since 2025-07-05
 */
public interface IPaymentProduct {

    /**
     * 获取产品类型
     *
     * @return 产品类型标识（如：JSAPI、NATIVE、APP、H5等）
     */
    String getProductType();

    /**
     * 获取产品名称
     *
     * @return 产品显示名称
     */
    String getProductName();

    /**
     * 获取产品版本
     *
     * @return 产品版本号
     */
    String getProductVersion();

    /**
     * 创建支付订单
     *
     * @param request 支付请求
     * @return 支付结果
     * @throws PaymentProductException 支付创建失败时抛出
     */
    PaymentResultDTO createPayment(PaymentRequestDTO request) throws PaymentProductException;

    /**
     * 查询支付状态
     *
     * @param request 查询请求
     * @return 查询结果
     * @throws PaymentProductException 查询失败时抛出
     */
    QueryResultDTO queryPayment(QueryRequestDTO request) throws PaymentProductException;

    /**
     * 关闭支付订单
     *
     * @param orderId 订单ID
     * @return 是否成功关闭
     * @throws PaymentProductException 关闭失败时抛出
     */
    boolean closePayment(String orderId) throws PaymentProductException;

    /**
     * 验证回调数据
     *
     * @param callbackData 回调数据
     * @return 验证结果
     * @throws PaymentProductException 验证失败时抛出
     */
    boolean verifyCallback(String callbackData) throws PaymentProductException;

    /**
     * 处理回调数据
     *
     * @param callbackData 回调数据
     * @return 处理结果
     * @throws PaymentProductException 处理失败时抛出
     */
    PaymentResultDTO processCallback(String callbackData) throws PaymentProductException;

    /**
     * 验证产品配置
     *
     * @param config 产品配置
     * @return 验证结果
     */
    boolean validateConfig(ProductConfigDTO config);

    /**
     * 获取支持的功能列表
     *
     * @return 功能列表
     */
    String[] getSupportedFeatures();

    /**
     * 获取产品配置模板
     *
     * @return 配置模板
     */
    String getConfigTemplate();

    /**
     * 检查产品是否可用
     *
     * @return 可用状态
     */
    boolean isAvailable();

    /**
     * 初始化产品
     *
     * @throws PaymentProductException 初始化失败时抛出
     */
    void initialize() throws PaymentProductException;

    /**
     * 销毁产品资源
     */
    void destroy();

    /**
     * 获取产品统计信息
     *
     * @return 统计信息
     */
    java.util.Map<String, Object> getStatistics();

    /**
     * 检查产品是否已初始化
     *
     * @return 初始化状态
     */
    boolean isInitialized();

    /**
     * 获取产品配置
     *
     * @return 产品配置
     */
    ProductConfigDTO getProductConfig();

    /**
     * 设置产品配置
     *
     * @param config 产品配置
     */
    void setProductConfig(ProductConfigDTO config);
}